{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Seaborn\n",
    "\n",
    "那么Pandas与Seaborn之间有什么区别呢？\n",
    "\n",
    "其实两者都是使用了matplotlib来作图，但是有非常不同的设计差异\n",
    "\n",
    "1. 在只需要简单地作图时直接用Pandas，但要想做出更加吸引人，更丰富的图就可以使用Seaborn\n",
    "2. Pandas的作图函数并没有太多的参数来调整图形，所以你必须要深入了解matplotlib\n",
    "3. Seaborn的作图函数中提供了大量的参数来调整图形，所以并不需要太深入了解matplotlib\n",
    "4. Seaborn的API：https://stanford.edu/~mwaskom/software/seaborn/api.html#style-frontend"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 泰坦尼克号数据分析\n",
    "\n",
    "这是是历史中著名的海难事件，大量游客在事故中丧生，也有部分游客获救。现在这里有一份数据给出一批乘客的信息如姓名、年龄、性别、票价等等一些信息，和是否获救，然后让你建模分析，再去预测另一批乘客的获救与否。我们一起来看看\n",
    "\n",
    "## 掌握数据概况"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "%matplotlib inline\n",
    "sns.set()\n",
    "\n",
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\", category=DeprecationWarning)\n",
    "from sklearn.utils.testing import ignore_warnings\n",
    "\n",
    "def warn(*args, **kwargs):\n",
    "    pass\n",
    "import warnings\n",
    "warnings.warn = warn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train = pd.read_csv(\"titanic/train.csv\")\n",
    "df_test = pd.read_csv(\"titanic/test.csv\") # 留作练习让你们分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Name</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Ticket</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Cabin</th>\n",
       "      <th>Embarked</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Braund, Mr. Owen Harris</td>\n",
       "      <td>male</td>\n",
       "      <td>22.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>A/5 21171</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n",
       "      <td>female</td>\n",
       "      <td>38.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>PC 17599</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C85</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>Heikkinen, Miss. Laina</td>\n",
       "      <td>female</td>\n",
       "      <td>26.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>STON/O2. 3101282</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n",
       "      <td>female</td>\n",
       "      <td>35.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>113803</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>C123</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Allen, Mr. William Henry</td>\n",
       "      <td>male</td>\n",
       "      <td>35.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>373450</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Survived  Pclass  \\\n",
       "0            1         0       3   \n",
       "1            2         1       1   \n",
       "2            3         1       3   \n",
       "3            4         1       1   \n",
       "4            5         0       3   \n",
       "\n",
       "                                                Name     Sex   Age  SibSp  \\\n",
       "0                            Braund, Mr. Owen Harris    male  22.0      1   \n",
       "1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1   \n",
       "2                             Heikkinen, Miss. Laina  female  26.0      0   \n",
       "3       Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0      1   \n",
       "4                           Allen, Mr. William Henry    male  35.0      0   \n",
       "\n",
       "   Parch            Ticket     Fare Cabin Embarked  \n",
       "0      0         A/5 21171   7.2500   NaN        S  \n",
       "1      0          PC 17599  71.2833   C85        C  \n",
       "2      0  STON/O2. 3101282   7.9250   NaN        S  \n",
       "3      0            113803  53.1000  C123        S  \n",
       "4      0            373450   8.0500   NaN        S  "
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- PassengerId => 乘客ID\n",
    "-　Survived => 是否获救\n",
    "- Pclass => 乘客等级(1/2/3等舱位)\n",
    "- Name => 乘客姓名\n",
    "- Sex => 性别\n",
    "- Age => 年龄\n",
    "- SibSp => 堂兄弟/妹个数\n",
    "- Parch => 父母与小孩个数\n",
    "- Ticket => 船票信息\n",
    "- Fare => 票价\n",
    "- Cabin => 客舱\n",
    "- Embarked => 登船港口"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 891 entries, 0 to 890\n",
      "Data columns (total 12 columns):\n",
      "PassengerId    891 non-null int64\n",
      "Survived       891 non-null int64\n",
      "Pclass         891 non-null int64\n",
      "Name           891 non-null object\n",
      "Sex            891 non-null object\n",
      "Age            714 non-null float64\n",
      "SibSp          891 non-null int64\n",
      "Parch          891 non-null int64\n",
      "Ticket         891 non-null object\n",
      "Fare           891 non-null float64\n",
      "Cabin          204 non-null object\n",
      "Embarked       889 non-null object\n",
      "dtypes: float64(2), int64(5), object(5)\n",
      "memory usage: 83.6+ KB\n"
     ]
    }
   ],
   "source": [
    "df_train.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "粗略观察一下数据，发现age里有不少缺失，Cabin（舱号）大量缺失，其他属性个别缺失"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 648x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(9,5))\n",
    "sns.heatmap(df_train.isnull(), cbar=False, cmap=\"YlGnBu_r\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 这些是类别列\n",
    "cols = ['Survived', 'Sex', 'Pclass', 'SibSp', 'Parch', 'Embarked']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuwAAAGoCAYAAAAdAbAbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzs3XucHFWd///XXMiF3BiScAmEAAt58xMQDSCsX2B1H2iU3Siyiy5XgUVBWBQVEDEIqCgbUBGJEgUlEMHL7hd0FRdBBWURUYTdLwqfoAshASSTZAxJJAmZmd8fpwY641y6Z7q7+vJ+Ph55ZKpOVdfp6flUf+rUOadaent7MTMzMzOz2tSadwXMzMzMzGxwTtjNzMzMzGqYE3YzMzMzsxrmhN3MzMzMrIY5YTczMzMzq2FO2M3MzMzMapgTdisrSddJurgCr3uppCXlfl0zM7NmIukNklbkXQ8rTXveFbDqkHQYsADYF+gGHgPOjYhflfM4EXFmOV/PzCqvWucHMys/SU8BO5JidwNwB3BORKzPsVpWZm5hbwKSJgPfB74IbA/sAlwGbCrxdVok+W/GrIGU6/xgZrmaFxETgTnAwcD8nOtjZeYW9uYwGyAibs2WXwR+BKmrCbBXRJyYLe8OPAlsExFbJN0D/BfwBtKJ4HJJR0fEQX0vLumDwBsj4m2SbgRWRMR8SY8B50fE97Pt2oE/Am+OiN9IOhT4HPAqYBnwgYi4J9t2D+DG7JgPAFH234qZwRDnBwBJpwHnAzsBDwLvjYhlkl4PfA94bUQsl3QAcC9waEQ8Xs03YGZJRDwj6YfAfpK2Bz4LzAXGA/dGxNH995F0IfAeYAdgOfCxiLgtK9sLuAF4DfAS8OOIeJekFtL39wnAWNJ3+PER8Wil32Ozcmtpc1gKdEtaLOmtkjpK3P8k4L3AJFIrnCTtXVB+PHDLAPvdChxXsDwXWJUl67sAPwA+RWrVOw/4d0nTs21vAR4CpgGfBN5dYp3NrDiDnh8kHQ1cBBwDTAd+ToprIuJ+YBGwWNJ44GZgvpN1s/xImgkcBTxMisltSV3ddgA+P8hufwAOB6aQ7q4tkbRzVvZJ0gV8B7ArKQcAeDNwBOmCfzvgXcDqMr8dK+AW9iYQES9kfVQ/AnwV2EnSHaQr6mLcGBG/zX5eK+m7pET8E1nivg+ppa2/W4CHJW0bEX9m68T+ROCOiLgjW75L0q+BoyT9lHRL78iI2AT8TNJ/lPSmzawow5wfzgA+ExGPAUj6NHCRpFkRsQy4lHQH7EHgGWBhDm/BzOB2SVuAtaTGsC+RYnJqRHRl29w70I4R8Z2CxW9J+ijwOuC7pFb1WcCMiFgB3Jdt9xKpEW8f4MG+c4RVjlvYm0REPBYRp0TErsB+wAzg6iJ3X95v+RZeaTk/Hrg9S8j7H/P3pMFr8yRtC7yNVxL2WcCxkv7U9w84DNg5q1tXRGwoeLllRdbVzEo0xPlhFvCFghhdA7SQ+rkTES+Ruq7tB3w2InrzqL+ZcXREbBcRsyLiLGAmsKYgWR+UpJMlPVIQ5/uR7m4DXECK+Qcl/TbrIkdE/AS4lnSR/rykr2TjYaxCnLA3oeyW9Y2koNxAumXWZ6cBdun/JfwjYJqk15AS94G6w/Tp6xbzduB3WRIP6SLg5uwE0/dvQkRcATwHdEiaUPA6uxX37sxsNPqdH5YDZ/SL0/FZdxiyrm2XAF8HPitpbF71NrOtLAe2l7TdUBtJmkW6s/YvpNb47YBHSUk6EfHHiHhPRMwg3XH7UtavnYi4JiIOJHW5mU0a62IV4oS9CUjaR9KHJe2aLc8kJdEPAI8AR0jaTdIU4KPDvV5EbAH+DbiS1P/8riE2/yapr9v72DqxX0JqeZ8rqU3SuGxu2F2zW+2/Bi6TNCa7XT+v1PdtZsMb5vxwHfBRSftmZVMkHZv93EJK7G8A/pl0of3J6r8DM+svIp4DfkhKsDskbSPpiAE2nUBqlOsEkHQq6WKdbPnYvnMD0JVt2y3pYEmHSNqG1PC3kTStpFWIE/bmsA44BPilpA2kL+JHgQ9HxF3At4D/IQ3y/H6Rr3kLcCTwnSyBH1B20vgF8PrsOH3rl5Na3S8inSiWk67O+/4mj8/qvIbUgndTkfUys9IMdX64DfhX4JuSXsjWvzXb7/2kuZ8vzrrCnAqcKunwar8BMxvQSaS+5o8DK4Fz+28QEb8jzSTzC+B5YH/SzHB9DiadG9aTxqp9ICKeBCaTWua7SF1WVwNXVeydGC29ve5yaGZmZmZWq9zCbmZmZmZWw5ywm5mZmZnVMCfsZmZmZmY1rJEfnDSWNFjiOTxy2RpPG2nO+l8Bm3KuSx4c39bImj2+wTFuja3kGG/khP1g0mO0zRrZ4bzy5Llm4vi2ZtCs8Q2OcWsORcd4IyfszwF0dW2gp8cz4VhjaW1toaNjAmR/503I8W0Ny/ENOMatgY0kxhs5Ye8G6OnpdbBbI2vWW8WOb2sGzRrf4Bi35lB0jHvQqZmZmZlZDXPCbmZmZmZWw5ywm5mZmZnVsEbuw262le7uLXR1dbJly+a8q1K09vYxdHRMp63NoWo2lHqMb3CMl6oeP+fW1jbGj5/IxIlTaGlpybs6Vqea/gwxafI4xo3dJu9qbGXjppdY98LGvKvRcLq6Ohk3blsmTNipLk6avb29bNjwAl1dnUybtnPe1alLju/mUW/xDY7xkai3z7m3t5fu7i2sW/cnuro62X77HfKuUt2oxvm7ns7HTZ+wjxu7Dcdf8I28q7GVWxacwDrq4w+onmzZsrluTvIALS0tTJgwmfXr/5R3VeqW47t51Ft8g2N8JOrtc25paaG9fRu2224qzz+/Iu/q1JVqnL/r6XzsPuzWVOrlJN+n3uprlqd6jJd6rHPe6vF31tLSCnh6Shs5J+xmZmZmZjWs6bvEWPOqVP+4UvrEPf30Mi6//FLWrl3LlClTmD//MmbO3K3sdTJrRnnHuOO78vL+jMGfs1WHE3ZrWpXqH1dKn7irrvoMxxxzLHPnHsWdd97BlVd+mmuuua7sdTJrRnnHuOO78vL+jMGfs1WHu8SY5aSraw1Llz7OkUfOBeDII+eydOnjdHV15VwzMxstx3dz8Ods1eKE3Swnzz//PNOm7UBbWxsAbW1tTJs2nZUrn8+5ZmY2Wo7v5uDP2arFCbuZmZmZWQ1zwm6Wkx133JFVq1bS3d0NQHd3N6tWdbLDDjvmXDMzGy3Hd3Pw52zVUrVBp5KeAjZm/wA+EhF3SjoUWASMB54CToyIldk+g5aZ1buOju3Za6/Z3H33ncydexR3330ne+8tOjo68q6amY2S47s5+HO2aqn2LDH/GBGP9i1IagGWAKdExH2S5gNXAKcNVVblOluD2rjpJW5ZcEJFXrdY559/EZ/61CV8/evXM2nSJC6++LKy18esWeUd447vysv7MwZ/zlYdeU/reBCwMSLuy5avI7WknzZMmdmorXthY+6PJJ41a3e++tXFudbBrFHlHeOO78rL+zMGf85WHdVO2L+RtZzfB1wE7AYs6yuMiFWSWiVtP1RZRKwp9oBTp04sX+2raPr0SXlXoeGsXNlKe3v9DdtobW3134OZmVkTq2bCfnhELJc0FrgauBa4rdIHXb16PT09vYOW12oi1Nm5Lu8qNJyenh62bOnJuxol6+np+Yu/h9bWlrq9GDUzM7PSVK25MSKWZ/9vAr4E/B/gaWBW3zaSpgG9WQv6UGVmZmZmZk2hKgm7pAmSpmQ/twD/BDwCPASMl3RYtumZwLezn4cqMzMzMzNrCtXqErMj8O+S2oA24HfAWRHRI+kkYJGkcWRTNwIMVWZmZmZm1iyqkrBHxP8Crx2k7H5g/1LLzKz2SLoEuBTYPyIe9XMWzMzMRi/vaR3NctMxZQztY8aW/XW3bN5E19rNZX/dWidpDnAoafyJn7NguXOMNz5/xtYsnLBb02ofM5aHFpxe9tc98ILrgeFP9NdeezX33vsTnnvuWW666ZvsuedeZa9LtWSzPy0Ejgd+mq32cxYsV47xxufP2JqFE3aznBx++Bs49th/4uyz35N3VcrhE8CSiHhSUt86P2dhELU6nWw9q/ZzFoo51hve8EaOO+54zjjjn2lrG7x+ftZC/Wqw87jVMCfsZjk54IDX5F2FspD018DBwIXVPrafs2B9qv2chWKOtd9+B7z8c3f34PXr/6wFP2ehfjTKedxqX/099tHMas3fAPsAT0p6CtgVuBPYCz9nwczMbNTcwm5moxIRV5AGjAKQJe1/T5q+9b2SDsv6qg/4nIUBysysxki6HdgD6AHWA+dExCOSZgOLganAauDkiHgi22fQMjMrjVvYzawiIqIHOAn4sqQnSC3xFw5XZmY16d0RcUBEvBa4Cvhatv46YGFEzCYNPF9UsM9QZWZWArewm1lZRcTuBT/7OQtmDSAi1hYsTgF6JO0AzAHelK2/FbhW0nSgZbCyiOisUrXNGoYTdmtaWzZvyqbuKv/rFuPqq6/k3nt/ypo1qzn33LOZPHkKS5a4V4hZuTjGy0vS9cCbScn4W4CZwDMR0Q0QEd2Sns3WtwxRVraE3Z+xNQsn7Na00kMx8nswxrnnns+5556f2/HNGp1jvLwi4nQASScBVwIXV/qY/WfL6T9957oNW2DDloocu5ipO8877yOcd95Hino9T99Zm+rlM3HCbmZmZkWLiJslfQVYAewiqS1rQW8DZgDLSS3sg5UVrf/UrdWevrOc+k/faUOrViKdx2cykqlbPejUzMzMBiVpoqSZBcvzgDXASuAR4Lis6Djg4YjojIhBy6pXc7PG4RZ2ayq9vb20tLTkXY2i9fYO/lAgM9tavcU31E2MTwC+I2kC0E1K1udFRK+kM4HFkj4OdAEnF+w3VNmI1efn3EO66WA2Mk7YrWm0t49hw4YXmDBhcl2c7Ht7e9mw4QXa28fkXRWzmldv8Q31E+MR8Txw6CBljwOHlFo2UvX2Off29tLdvYV167oYM2Zc3tWxOuaE3ZpGR8d0uro6Wb/+T3lXpWjt7WPo6JiedzXMal49xjc4xktVj59za2sb48dPZOLEKXlXxeqYE3ZrGm1t7UybtnPe1TCzCnB8Nwd/ztasqp6wS7oEuBTYPyIelXQo6eln44GngBOzwSoMVWZmZmZm1gyqOkuMpDmkfnBPZ8stwBLg7OzRxT8DrhiuzMzMzMysWVQtYZc0FlgInAX0DYs/CNgYEfdly9cB7yyizMzMzMysKVSzS8wngCUR8aSkvnW7Acv6FiJilaRWSdsPVRYRa4o9aKkT09eKennylpmZmZlVVlUSdkl/DRwMXFiN4xXq/5S0/mo1MfbT0GwoI3lKmpmZmdWnanWJ+RtgH+BJSU8BuwJ3AnsBs/o2kjQN6M1a0J8eoszMzMzMrClUJWGPiCsiYkZE7B4RuwMrgLnAlcB4SYdlm54JfDv7+aEhyszMzMzMmkJVZ4npLyJ6gJOAL0t6gtQSf+FwZWZmZmZmzSKXBydlrex9P98P7D/IdoOWmZmZmZk1g1xb2M3MzMzMbGhO2M3MzMzMapgTdjMzMzOzGuaE3czMzMyshuUy6NTMGouk24E9gB5gPXBORDwiaTawGJgKrAZOjognsn0GLTMzM7NXuIXdzMrh3RFxQES8FrgK+Fq2/jpgYUTMBhYCiwr2GarMzMzMMk7YzWzUImJtweIUoEfSDsAc4NZs/a3AHEnThyqrVp3NzMzqhbvEmFlZSLoeeDPQArwFmAk8ExHdABHRLenZbH3LEGWdxR5z6tSJ5X0TVTJ9+qS8q2BmZnXECbuZlUVEnA4g6STgSuDiSh9z9er19PT0Dlpeq4lxZ+e6vKtgNay1taVuL0bNrDKKTtglnRcRVw2w/kMR8bnyVsusejqmjKF9zNi8q7GVLZs30bV2c9WOV874joibJX0FWAHsIqkta0FvA2YAy0kt7IOVmVmZ+TvcrL6V0sL+cdJgsv7mAw52q1vtY8by0ILT867GVg684Hqgegk7o4hvSROBjohYni3PA9YAK4FHgOOAJdn/D0dEZ7bdoGVmVnb+DjerY8Mm7JL+NvuxTdIbSS1jffYEfG/XrE6VKb4nAN+RNAHoJiXr8yKiV9KZwGJJHwe6gJML9huqzMzKwN/hZo2hmBb2G7L/x/HKVG0AvcAfgXPKXSkzq5pRx3dEPA8cOkjZ48AhpZaZWdn4O9ysAQybsEfEHgCSbooIt4CZNRDHt1ljc4ybNYai+7AXBrqk1n5lPeWslJlVl+PbrLE5xs3qWymzxMwhPY3w1aRba5D6wvUCbeWvmplVi+PbrLE5xs3qWymzxCwG/gM4DfhzZapjZjlxfJs1Nse4WR0rJWGfBXwsIgZ/SskQJN0O7AH0AOuBcyLiEUmzSSeSqcBq4OSIeCLbZ9AyMyurUcW3mdU8x7hZHSslYb+N9NjxO0d4rHdHxFoASW8njVafA1wHLIyIJZJOBBYBfdNQDVVmZuUz2vg2s9o24hiXNBW4GfgrYBPwe+CMiOiUdCjpu3k88BRwYkSszPYbtMzMSlNKwj4OuE3SfaSpoF5WzMjzvmQ9MwXokbQDKWl/U7b+VuBaSdNJfesGLPPDVczKblTxbWY1bzQx3gssiIh7ACRdCVwh6XTSg89OiYj7JM0HrgBOk9QyWFk535RZsyglYf9d9m/EJF1PusJvAd4CzASeiYhugOwR5c9m61uGKCs6YZ86deJoqpyb6dMn5V0Fy1mV/wZGHd9mVtNGHOMRsQa4p2DVA8D7gIOAjRFxX7b+OlJL+mnDlJlZiUqZ1vGy0R4sIk4HkHQScCVw8WhfczirV6+np2fwLnu1mhh3dvrhc9VSj38Dra0tZb0YLUd8m1ntKleMZ1NCvg/4HrAbsKzgGKsktUrafqiy7AKgKPXa6Gb1o1ZzgP5KmdZx0L7jEfGTUg4aETdL+gqwAthFUlvWgt4GzACWk1rYByszszIqZ3ybWe0pY4x/kTRxxLXAO0Zbr+EM1+hmjataiXQeDaQjaXQrpUvMDf2WpwNjSEn3nkPtKGki0BERy7PlecAaYCXwCHAcqa/bccDDfX3UJQ1aZmZlNeL4NrO6MOoYl3QVsDcwLyJ6JD1Nmn2mr3wa0BsRa4YqG93bMGtOpXSJ2aNwOWvxng8Uc2kyAfiOpAlANylZnxcRvZLOBBZL+jjQBRQOfhmqzMzKZJTxbWY1brQxLuly4EDg7yJiU7b6IWC8pMOyvupnAt8uoszMSlRKC/tWsm4ql5Ouzj83zLbPA4cOUvY4cEipZWZWOaXEt5nVn1JiXNK+wEXAUuB+SQBPRsQ7sjFpiySNI5u6MXv9nsHKzKx0I07YM28iPQjJzBqP49ussRUV4xHxW9K4soHK7gf2L7XMzEpTyqDT5aS5WPtsS5rX9axyV8rMqsvxbY2qY8oY2seMzbsaW9myeRNdazdX9ZiOcbP6VkoLe/9bWRuApRHxQhnrY2b5cHxbQ2ofM5aHFpyedzW2cuAF1wPVTdhxjJvVtVIGnd4LL8/BuiPwfET4drlZA3B8mzU2x7hZfWstdkNJkyTdBLwIPAO8KGmxpCkVq52ZVYXj26yxOcbN6lvRCTvpYQkTSANIxmf/bwtcU4F6mVl1Ob7NGptj3KyOldKH/S3AnhHx52x5qaRTgT+Uv1pmVmWOb7PG5hg3q2OltLBvJD0ZrdA0YNMA25pZfXF8mzU2x7hZHSulhf164C5JnwOWkR45/EHgq5WomJlV1ajiW9JU4Gbgr0gJwO+BMyKiU9KhwCLSbfingBMjYmW236BlZlZW/g43q2OlJOyXkwaqnADMAJ4FFkTEDZWomJlV1Wjjuzfb/h4ASVcCV0g6HVgCnBIR90maD1wBnCapZbCyMr4vM0v8HW5Wx0rpEvMFICLiyIh4VUQcCTwm6eoK1c3MqmdU8R0Ra/qS9cwDpBa8g4CNEXFftv464J3Zz0OVmVl5+TvcrI6V0sJ+HHBev3UPAbcD55atRmaWh7LFdzbP8/uA7wG7kW6/AxARqyS1Stp+qLKIWFPMsaZOnVhK1WrG9OmT8q6C5SyHvwF/h5vVsVIS9l6grd+6NkprpTez2lTO+P4isB64FnjHKOs1pNWr19PT0ztoea0mxp2d6/KuQtOox7+B1taWSlyM+jvcrI6VEqg/Bz6ZtZ71taJdmq03s/pWlviWdBWwN/Cu7CmKT5O6xvSVTwN6sxb0ocrMrLz8HW5Wx0pJ2D8AHAk8J+lB0oCVNwHnVKJiZlZVo45vSZcDBwJHR0TfVHEPAeMlHZYtnwl8u4gyMysvf4eb1bGiu8RExApJc4DXATOB5cCDWSuamdWx0ca3pH2Bi4ClwP2SAJ6MiHdIOglYJGkc2dSN2TF7Biszs/Lyd7hZfSulDztZYD+Q/Sua52g2q30jje9s398CLYOU3U96DHpJZWZWXqOJcTPLV7UGm/TN0ayIeDXpUchXFMzDfHZEzAZ+RpqHmaHKzMzMzMyaRVUSds/RbGZmZmY2MiV1iSmHas7RbGZmZlaKjiljaB8ztqLH2LJ5E11rN1f0GNZYqp6wU8U5msEPVrH65b8BM7Pqax8zlocWnF7RYxx4wfWAE3YrXlUT9oI5mudlM0QMOg/zUGWlHNMPVrHh1OPfQIUerGJmZmY1qGpPOPMczWZmZmZmpatKC7vnaDYzMzMzG5mqJOyeo9nMzMzMbGSq1iXGzMzMzMxKl8csMWZmZmZmuerZ8lJFJ54o5/SdTtjNzMzMrOm0tm9T0Sk8yzl9p7vEmJmZmZnVMCfsZmZmZmY1zF1izMzMbFDZQw//Adgd2D8iHs3WzwYWA1OB1cDJEfHEcGVmVjq3sJuZmdlQbgeOAJb1W38dsDAiZgMLgUVFlplZiZywm5mZ2aAi4r6IWF64TtIOwBzg1mzVrcAcSdOHKqtWnc0ajbvEmJmZWalmAs9ERDdARHRLejZb3zJEWWcpB5k6dWJ5a11DKjmdoNWOcn3OTtjNzMysJq1evZ6ent6qHrNaiXRn57qit500eRzjxm5TwdrAxk0vse6FjRU9Rika5YJmoM+5tbWl5ItRJ+xmZmZWquXALpLashb0NmBGtr5liDIbgXFjt+H4C75R0WPcsuAE1lE7CbttzX3YzczMrCQRsRJ4BDguW3Uc8HBEdA5VVv2amjUGJ+xmZmY2KEnXSFoB7ArcLem3WdGZwDmSlgLnZMsUUWZmJXKXGDMbNc/TXLyeLS/VXN/MLZs30bW2PI/PtsYTEe8H3j/A+seBQwbZZ9Ayq02VPjf5PDM6TtjNrBxuB74A/Lzf+r65mJdIOpE0F/PfFlHWsFrbt+GhBafnXY2tHHjB9YC/SM2aWaXPTT7PjI67xJjZqHmeZjMzs8pxC7uZVUrF52lu5Dmaq63Wuuk0Ov++R64aUxya1ZqqJOzu32pmlTDcHM1OiopXypzQ9aRW/waG+n2PZI7mZlLpKQ5vWXBCxV7bbKSq1SXmduAIYFm/9X19WGcDC0l9WIspM7Pa9/I8zQD95mIeqszMzMwKVCVhd/9Ws+bjeZrNzMzKI88+7BXv3wr128e1Vm/jWvXU09+ApGuAY4CdSPM0r46IfUlzLy+W9HGgCzi5YLehyszMzCzT8INO67WPa6P2J61F9fg3UGt9XD1Ps4EHA5qZVUqeCfvLfVizFvTCPqwtQ5SZmVkNqvRgwJHwAEIzawS5zcPu/q1mZmZmZsOrSsIu6RpJK4BdSf1bf5sVnQmcI2kpcE62TBFlZmZmZmZNoSpdYty/1czMzMxsZHLrEmNmZmZmZsNzwm5mZmZmVsOcsJuZmZmZ1TAn7GZmZmZmNcwJu5mZmZlZDXPCbmZmZmZWw5ywm5mZmZnVMCfsZmZmZmY1zAm7mZmZmVkNc8JuZmZmZlbDnLCbmZmZmdUwJ+xmZmZmZjXMCbuZmZmZWQ1zwm5mZmZmVsOcsJuZmZmZ1TAn7GZmZmZmNaw97woMR9JsYDEwFVgNnBwRT+RbKzMrB8e3WWNzjJuVRz20sF8HLIyI2cBCYFHO9TGz8nF8mzU2x7hZGdR0wi5pB2AOcGu26lZgjqTp+dXKzMrB8W3W2BzjZuVT611iZgLPREQ3QER0S3o2W985zL5tAK2tLcMeZFrHhFFWs/yKqbeVz5jJU/Ouwl8Y6m+goKytKpWpjKaN73r7eyuFf9/FaYL4hgrGeKX/zqrxN1NqzFUjtir9vv2e/2Jd0THe0tvbW6YqlZ+kA4GbImLfgnW/A06MiN8Ms/thwM8rWT+zGnA4cF/elRgJx7fZsOo2vsExblaEomO81lvYlwO7SGrLrszbgBnZ+uH8ivSLeA7ormAdzfLQBuxM+juvV45vs4E1QnyDY9xsMCXHeE0n7BGxUtIjwHHAkuz/hyNiuFtpAJuo45YJsyL8Ie8KjIbj22xIdR3f4Bg3G0ZJMV7TXWIAJO1DmhKqA+giTQkV+dbKzMrB8W3W2BzjZuVR8wm7mZmZmVkzq+lpHc3MzMzMmp0TdjMzMzOzGuaE3czMzMyshjlhNzMzMzOrYU7YzczMzMxqWE3Pw95sJM0mTX81FVhNmv7qiXxr1ZgkXQX8A7A7sH9EPJpvjaxZSboUmBgR5+Vdl1oi6WjgM8BG4J8qORWgpBuBX0fEtZU6htW+ZvxekDQVuBn4K9Lc978Hzihyrvy6Jel2YA+gB1gPnBMRj+Rbq6G5hb22XAcsjIjZwEJgUc71aWS3A0cAy/KuiJkN6Azg4xHxWs/bbVXSjN8LvcCCiFBEvJr0MJ8rcq5TNbw7Ig6IiNcCVwFfy7tCw3ELe42QtAMwB3hTtupW4FpJ0xv9SjcPEXEfgKS8q2J1TFIvMB84mnRn7D3AkcBbgG2AYyPiMUk7kWJ6MjAO+EFEXDDIa14A/CPp/PwM8J6I+GOl30stkfR50mPpJeks4EJSEjE52+TjEfEDSbsDvwa+SvqdjwdOAM4EDgFeBN4eEX+UtD/wJWAC6TP4SkRcPcCxxwCXA38DjAH+H/C+iFhfobdrNaIZvxciYg1wT8GqB4D35VOb6omItQWLU0gt7TXNLey1YybwTER0A2T/P5utN7Pa9aeIOBj4CPBd4L6s1eYm4GN92wBQXJwmAAAgAElEQVTzIuJA4DXAQZLe0v+FJJ0I7AUcGhFzgDuAz1bhPdSUiPggKRF/P/AO0t3H47Pf398DiyRtl20+lVd+5zcAPybdqXw18BDwL9l2TwFHZr/X1wHvlfT/DXD4C4C1EfG6iHgN6Tz80Qq8TbOaIqmVlKx/L++6VIOk6yU9TbpAf3fe9RmOW9jNzEbnW9n/vwF6I+IH2fJDwDHZz23AlZJeD7QAO5ES9//s91pvAw4CfpO18rUDa2luryf1Nf1hQctnL+nCZhWwvuB3/htgRUFf1Id45a7ltsCXJR1Aak2bARwAPNbveG8DJkv6x2x5LPDfZX1HZrXpi6T+3E0xliMiTgeQdBJwJXBUvjUamhP22rEc2EVSW0R0S2ojfaEsz7leZja0jdn/3aRBWxQs951jPwR0AIdExEZJXyF1y+ivBfhURNR8f8oqagH+JyKO6F+QdYnp/zvf2G+57zP4NPBH4JSI2CLpRwz+GZwVET8pQ93N6kI24HZv0p3Amu8eUk4RcbOkr0iaGhGr867PYNwlpkZExErgEeC4bNVxwMPuv27WELYDnsuS9V2Atw+y3feAsyR1AEgam7UIN7P7gb0lvbFvhaSDJbWU+DrbAcuzZH0/Uh/5gXwP+JCk8dmxJg3SdcasIUi6HDgQODoiNg23fb2TNFHSzILlecCa7F/Ncgt7bTkTWCzp40AXcHLO9WlYkq4hdVfYCbhb0uqI2Dfnalnjugb4jqSHSXfNfjzQRllLzzTg3qz7RytpoGTTdsmIiC5JbyN1KbqaNBD0f4F5Jb7Up4Cbs3ECfwB+Nsh2VwCXAr+S1EPqfnMZf9l1xhpMM34vSNoXuAhYCtyfnXeejIh35FqxyppAOh9PIN2FW0O6s9Cbb7WG1tLbW9P1MzMzMzNrau4SY2ZmZmZWw5ywm5mZmZnVMCfsZmZmZmY1zAm7mZmZmVkNc8JuZmZmZlbDnLBbWUm6TtLFFXjdSyUtKffrmpmZNRNJb5C0Iu96WGk8D3uTkHQYsADYlzTv6GPAuRHxq3IeJyLOLOfrmVnlVev8YGblJ+kpYEdS7G4A7gDOiYj1OVbLyswt7E1A0mTg+8AXge2BXUgPAinpiWaSWiT5b8asgZTr/GBmuZoXEROBOcDBwPyc62Nl5hb25jAbICJuzZZfBH4EqasJsFdEnJgt7w48CWyTPcL7HuC/gDeQTgSXSzo6Ig7qe3FJHwTeGBFvk3QjsCIi5kt6DDg/Ir6fbdcO/BF4c0T8RtKhwOeAVwHLgA9ExD3ZtnsAN2bHfACIsv9WzAyGOD8ASDoNOJ/09McHgfdGxDJJrwe+B7w2IpZLOgC4Fzg0Ih6v5hswsyQinpH0Q2A/SdsDnwXmAuOBeyPi6P77SLoQeA+wA+lJzB+LiNuysr2AG4DXAC8BP46Id0lqIX1/nwCMJX2HHx8Rj1b6PTYrt5Y2h6VAt6TFkt4qqaPE/U8C3gtMIrXCSdLeBeXHA7cMsN+twHEFy3OBVVmyvgvwA9LjwrcHzgP+XdL0bNtbgIeAacAngXeXWGczK86g5wdJR5MeW34MMB34OSmuiYj7gUXAYknjgZuB+U7WzfIjaSZwFPAwKSa3JXV12wH4/CC7/QE4HJhCuru2RNLOWdknSRfwHcCupBwA4M3AEaQL/u2AdwGry/x2rIBb2JtARLyQ9VH9CPBVYCdJd5CuqItxY0T8Nvt5raTvkhLxT2SJ+z6klrb+bgEelrRtRPyZrRP7E4E7IuKObPkuSb8GjpL0U9ItvSMjYhPwM0n/UdKbNrOiDHN+OAP4TEQ8BiDp08BFkmZFxDLgUtIdsAeBZ4CFObwFM4PbJW0B1pIaw75EismpEdGVbXPvQDtGxHcKFr8l6aPA64DvklrVZwEzImIFcF+23UukRrx9gAf7zhFWOW5hbxIR8VhEnBIRuwL7ATOAq4vcfXm/5Vt4peX8eOD2LCHvf8zfkwavzZO0LfA2XknYZwHHSvpT3z/gMGDnrG5dEbGh4OWWFVlXMyvREOeHWcAXCmJ0DdBC6udORLxE6rq2H/DZiOjNo/5mxtERsV1EzIqIs4CZwJqCZH1Qkk6W9EhBnO9HursNcAEp5h+U9NusixwR8RPgWtJF+vOSvpKNh7EKccLehLJb1jeSgnID6ZZZn50G2KX/l/CPgGmSXkNK3AfqDtOnr1vM24HfZUk8pIuAm7MTTN+/CRFxBfAc0CFpQsHr7FbcuzOz0eh3flgOnNEvTsdn3WHIurZdAnwd+KyksXnV28y2shzYXtJ2Q20kaRbpztq/kFrjtwMeJSXpRMQfI+I9ETGDdMftS1m/diLimog4kNTlZjZprItViBP2JiBpH0kflrRrtjyTlEQ/ADwCHCFpN0lTgI8O93oRsQX4N+BKUv/zu4bY/Jukvm7vY+vEfgmp5X2upDZJ47K5YXfNbrX/GrhM0pjsdv28Ut+3mQ1vmPPDdcBHJe2blU2RdGz2cwspsb8B+GfShfYnq/8OzKy/iHgO+CEpwe6QtI2kIwbYdAKpUa4TQNKppIt1suVj+84NQFe2bbekgyUdImkbUsPfRtK0klYhTtibwzrgEOCXkjaQvogfBT4cEXcB3wL+hzTI8/tFvuYtwJHAd7IEfkDZSeMXwOuz4/StX05qdb+IdKJYTro67/ubPD6r8xpSC95NRdbLzEoz1PnhNuBfgW9KeiFb/9Zsv/eT5n6+OOsKcypwqqTDq/0GzGxAJ5H6mj8OrATO7b9BRPyONJPML4Dngf1JM8P1OZh0blhPGqv2gYh4EphMapnvInVZXQ1cVbF3YrT09rrLoZmZmZlZrXILu5mZmZlZDXPCbmZmZmZWw5ywm5mZmZnVMCfsZmZmZmY1zAm7mZmZmVkNc8JuZmZmZlbDnLCbmZmZmdUwJ+xmZmZmZjXMCbuZmZmZWQ1zwm5mZmZmVsOcsJuZmZmZ1TAn7GZmZmZmNcwJu5mZmZlZDXPCbkWRdIKkHxUs90raK886mVltkXSPpNPzroeZgaQbJX2qjK93qaQlZXqtpyQdWY7XahbteVfAaoukw4AFwL5AN/AYcG5EfAP4RpGvMQb4DPAuYDugE7g9Ij5YkUqb2bAkPQXsSIrrDcAdwDkRsT7HaplZP/1itc+NEfEvuVTIaoITdnuZpMnA94H3Ad8GxgCHA5tKfKmPAgcBrwOeA2YBR5SvpmY2QvMi4m5JuwB3AvOBC4vdWVJ7RGypWO3MrM+8iLg770r0keR8MWf+AKzQbICIuDVbfhH4EYCkU4DTI+Kwgu2PknQuMBn4OvCRiOgBDgZui4hns+2eyv6RvdZTwCLgJGBn4HbgfRGxsQLvycz6iYhnJP0Q2E/SqcAFwK6ku2H/GhGLACS9AVgCfBH4IHAXcJKktwOXAXtm+5wdEf+ZvfwsSf8FvBr4BXB8RKyq2psza1DZ9/B7gAeBU4E1wImk7+5PAmOB8yNiccFu0yTdBRwK/AY4OSKWZa/3BeAYYArwBOlu+s+zskuB/YCNwNuAD/WryzbATaSGveOALaTzyHtId9Z/DJwZEWuy7U8CPgVMBD5Xpl9JU3Efdiu0FOiWtFjSWyV1DLP9O0gt6XOAtwOnZesfAD4k6SxJ+0tqGWDfE4C5wF+RTjbzy/IOzGxYkmYCRwEPAyuBvyddeJ8KfF7SnILNdwK2J90pe6+k15G+qM8nfTEfQcEFOXB89jo7kL7Mz6vkezFrMocA/wNMBW4BvklqJNuLlLxfK2liwfYnkJL5acAjbN219VfAa0jxfQvwHUnjCsrfDvwbKc5f3k/SeFJD2ybgnRGxGXg/cDTwN8AMoAtYmG3/KuDLpEa6GVnddx3dr6H5uIXdXhYRL2R92D8CfBXYSdIdpCvmgfxrdvW8RtLVpKvs60n917tIJ4rPA6slfbTfVf+1EbEcQNLlpBY8J+1mlXW7pC3AWuAHwKcj4sWC8nuzweWHk1rjAHqASyJiE4Ckfwa+FhF3ZeXP9DvG1yNiabbtt0mtc2ZWmr5Y7XM+8BLwZER8HUDSt4CPAZ/I4vNHkjaTkvdHsv1+EBE/y7b/GLBW0syIWB4RhQNIPytpPiDgv7N1v4iI27OfX5QE6cL+P7NtPhARvVn5GcC/RMSK7FiXAk9nLev/CHy/oB4XA+6PXyIn7LaViHgMOAVA0j6k2+FXk/q79re84OdlpCtnIqKbdGW9MLsSPw34mqQHs9cfdF8zq6ij+/eLlfRW4BLSna5WYFvg/xVs0tmvu9pM0oDVwfyx4Oc/k26Bm1lpBorVU4DnC1a9CBAR/dcVxtzL37URsV7SGtL37XJJHwZOz5Z7Scn4tIH2LXAosA1wXEGyDukO3G2SegrWdZMGz87oV48NklYP8No2BHeJsUFFxOPAjaR+bAOZWfDzbsCz/TeIiBcjYiGpxf1VpexrZpUlaSzw78BVwI4RsR0pGS/sxtbbb7flpK5sZlb7Xv6uzbrKbA88K+lw0t30dwIdWeyvZejYhzSu7TPAjyXtWLB+OfDWiNiu4N+4iHiGNPlEYT22JXWLsRK4hd1elrWo/x3wrYhYkfVzPY7UJ30g50v6Jelq/gNkA0mygaiPAL8k3cI7AZhE6i/b52xJ3ye1wF0EfKv878jMhjGGNFCtE9iStba/GXh0iH1uIN16/z7wU9LA8UnZBb6Z1Zajsq6uD5L6sv8yIpZL2p80ULQTaJd0IamFfVgRsSC72P+xpDdkg8qvAy6X9O6IWCZpOvD6iPguqR/8Lwvq8QncYFwy/8Ks0DrSgJZfStpAStQfBT48yPbfBR4iJec/IH2RQ7ol91nSrfFVwNnAP0TE/xbsewvpSv1/s39le7iDmRUnItaRBot9m3QX7Hjge8Ps0zdDxedJLXL3km6Hm1n5/Iek9QX/bhvh69xC6vK2BjiQ1IAGqZvrD0mTTSwjzQYzUBeYAUXEJ0kDT++WtD3wBdK540eS1pHyh0OybX9LygNuIbW2dwErRvh+mlZLb+9AdzzMKieb1vH0Wppj1szMzKxWuYXdzMzMzKyGOWE3MzMzM6th7hJjZmZmZlbDGnmWmLGkp389R5oL1KyRtJFm5/gV6WlzzcbxbY2s2eMbHOPW2EqO8UZO2A8Gfp53Jcwq7HDgvrwrkQPHtzWDZo1vcIxbcyg6xhs5YX8OoKtrAz097vZjjaW1tYWOjgmQ/Z03Ice3NSzHN+AYtwY2khhv5IS9G6Cnp9fBbo2sWW8VO76tGTRrfINj3JpD0TFe9YRd0iXApcD+EfGopEOBRcB44CngxIhYmW07aJmZmZmZWTOo6rSOkuYAhwJPZ8stwBLg7IiYDfwMuGK4MjMzMzOzZlG1hF3SWGAhcBbQd3/rIGBjRPR1uL8OeGcRZWZmZmZmTaGaXWI+ASyJiCcl9a3bDVjWtxARqyS1Stp+qLKIWFPsQadOnVie2puZ1bju7i10dXWyZcvmvKtStPb2MXR0TKetrZGHVJnZaDX7+a0qZ0hJf02aounCahyv0OrV65kwcSzjxm5T1PYbN73Euhc2VrhWZqPT2trii9ECkyaPKyrGGz2+u7o6GTduWyZM2ImWlpa8qzOs3t5eNmx4ga6uTqZN2znv6lidKDbeR6rRzxP1qtnPb9Vq0vgbYB+gr3V9V+BO4BpgVt9GkqYBvRGxRtLTg5WVevBxY7fh+Au+UdS2tyw4gXU4UM3qSbEx3ujxvWXL5rr5MgNoaWlhwoTJrF//p7yrYnWklO/0kWj080S9avbzW1X6sEfEFRExIyJ2j4jdgRXAXOBKYLykw7JNzwS+nf380BBlZmY2gHr5MutTb/U1s/zU2/minPXNtdNgRPRIOglYJGkc2dSNw5WZmdnwKtV1wF0GzCxvzXZ+yyVhz1rZ+36+H9h/kO0GLTMzs6FVqutAKV0Gnn56GZdffilr165lypQpzJ9/GTNn7lb2OplZc8n7/Fbtc1tV52E3M7PmctVVn+GYY47lm9/8vxxzzLFceeWn866SmdmoVfvc5oTdzMwqoqtrDUuXPs6RR84F4Mgj57J06eN0dXXlXDMbKUmXSOqVtF+2fKik/5a0VNKPJO1QsO2gZWb1LI9zmxN2MzOriOeff55p03agra0NgLa2NqZNm87Klc/nXDMbCT+t3CzJ49zmhN3MzMyG5KeVm+XLj5YzM7OK2HHHHVm1aiXd3d20tbXR3d3NqlWd7LDDjnlXzUrXVE8rnz59Ui7HtcGtXNlKe3t12pmHO86MGTuzatVKWlp6tzq3zZix81/s29raWpa/JyfsZmZWER0d27PXXrO5++47mTv3KO6++0723lt0dHTkXTUrQd5PK+/p6d1qXTWS6c7OdRU/hpWmp6eHLVt6qnKs4Y4zefJ27LXXbP7zP3/I3LlHceedP2TvvcWkSVP+Yt+enp6/+HsaydPKnbCbWdlIugS4FNg/Ih6VdCiwCBhP9iyFiFiZbTtomZXHxk0vccuCEyryusU6//yL+NSnLuHrX7+eSZMmcfHFl5W9PlZxuT6t3GwgeZ/fqn1uc8JuZmUxxIC0UyLiPknzSYPOThuqLJ/aN6Z1L2zM/RHrs2btzle/ujjXOtjoRMQVFAwYlfQU8PfA74D3Sjos66s+4NPKBygzG7W8z2/VPrd50KmZjZoHpJk1n4joAU4CvizpCVJL/IXDlZlZ6dzCbmblUDcD0hp5MFk1B2WVU7kGZVl1+GnlZtXnhN3MRqUWBqSVkuw18mCyag7KKqeBBmU1s5EMSDOzxlZ/TTFmVmsKB6Q9xSsD0vZi8EFnHpBmZmZWJCfsZjYqEXFFRMyIiN2zW+UrgLnAlWSDzrJNBxyQNkCZmZmZFXDCbmYV4QFpZmZm5eE+7GZWVh6QVjs6poyhfczYsr/uls2b6Fq7edjtrr32au699yc899yz3HTTN9lzz73KXhcza07Ndn5zwm5m1qDax4zloQWnl/11D7zgemD4L7TDD38Dxx77T5x99nvKXgcza27Ndn5zwm5mZhVxwAGvybsKZmYVUe3zm/uwm5mZmZnVMCfsZmZmZmY1zAm7mZmZmVkNc8JuZmZmZlbDPOjUzKxBbdm8KZvxoPyvW4yrr76Se+/9KWvWrObcc89m8uQpLFni52OZ2eg12/nNCbuZWYNKcwkPPz1ZpZx77vmce+75uR3fzBpXs53f3CXGzMzMzKyGOWE3MzMzM6thTtjNzMzMzGpY1fqwS7od2APoAdYD50TEI5JmA4uBqcBq4OSIeCLbZ9AyMzP7S729vbS0tORdjaL19vbmXQUzqxPNfH6rZgv7uyPigIh4LXAV8LVs/XXAwoiYDSwEFhXsM1SZmZkVaG8fw4YNL9RNEtzb28uGDS/Q3j4m76qYWY1r9vNb1VrYI2JtweIUoEfSDsAc4E3Z+luBayVNB1oGK4uIzipV28ysbnR0TKerq5P16/+Ud1WK1t4+ho6O6XlXw8xqXLOf36o6raOk64E3k5LxtwAzgWciohsgIrolPZutbxmizAm7mVk/bW3tTJu2c97VMDMru2Y/v1U1YY+I0wEknQRcCVxc6WNOnTqx5H2mT59UgZqYmZmZmZUulwcnRcTNkr4CrAB2kdSWtaC3ATOA5aQW9sHKirZ69fqSk/bOznUlbW9Wba2tLSO6GDUzM7P6U5VBp5ImSppZsDwPWAOsBB4BjsuKjgMejojOiBi0rBp1NjMzMzOrBdVqYZ8AfEfSBKCblKzPi4heSWcCiyV9HOgCTi7Yb6gyMzMzM7OGV5WEPSKeBw4dpOxx4JBSy8zMzKw6/CwVs3z5SadmZmY2HD9LxSxHTtjNzMxsSMM8S+XWbP2twBxJ04cqq1adzRpJLrPEmJmZWX3J41kqec2G5emdrdY4YTezUXP/VrPGl8ezVFavXk9Pz9aPoq9GMu3pna2SRjI1s7vEmFk5uH+rWZOIiJuBN1LwLBWAfs9LWT5EmZmVyAm7mY2a+7eaNS4/S8Usf+4SY2ZlUS/9W9031axkfpaKWc6csJtZWeTZv7WUJNx9U63WjaR/ayX5WSpm+XOXGDMrK/dvNTMzKy8n7GY2Ku7famZmVlnuEmNmo+X+rWZmZhXkhN3MRsX9W83MzCqr6C4xks4bZP2HylcdM8uD49ussTnGzepbKX3YPz7I+vnlqIiZ5crxbdbYHONmdWzYLjGS/jb7sU3SG0nzJ/fZE/AcaWZ1yvFt1tgc42aNoZg+7Ddk/4/jlceNA/QCfwTOKXelzKxqHN9mjc0xbtYAhk3YI2IPAEk3RYRncTBrII5vs8bmGDdrDEXPElMY6JJa+5X1lLNSZlZdjm+zxuYYN6tvRSfskuYAC4FXk26tQeoL1wu0lb9qZlYtjm+zxuYYN6tvpczDvhj4D+A04M+VqY6Z5cTxbdbYHONmdayUhH0W8LGI6K1UZcwsN45vs8bmGDerY6XMw34b8OZKVcTMcuX4NmtsjnGzOlZKC/s44DZJ95GmgnqZR56b1T3Ht1ljc4yb1bFSEvbfZf/MrPE4vs0am2PcrI6VMq3jZZWsiJnlx/Ft1tgc42b1rZRpHf92sLKI+El5qmNmeXB8mzU2x7hZfSulS8wN/ZanA2OAFcCeZatRznq2vMT06ZOG3W7L5k10rd1chRqZVUVTxLdZE3OMm9WxUrrE7FG4LKkNmA+sG25fSVOBm4G/AjYBvwfOiIhOSYcCi4DxwFPAiRGxMttv0LJKaW3fhocWnD7sdgdecD3ghN0aw2jiu54Ue0EOvii3xtIsMW7WqEppYd9KRHRLupx0df65YTbvBRZExD0Akq4ErpB0OrAEOCUi7pM0H7gCOE1Sy2BlI62zmRWnxPiuG8VekIMvyq2xNWqMmzWqESfsmTcBPcNtFBFrgHsKVj0AvA84CNgYEfdl668jtaSfNkyZmVVeUfFtZnXLMT6AUu7EjZTv4FmpShl0upzUUt5nW9K8rmeVckBJraRk/XvAbsCyvrKIWCWpVdL2Q5VlFwBFmTp1YinVK0mlA9qsWsoV32ZWmxzjxSvlTtxI+Q6elaqUFvYT+y1vAJZGxAslHvOLwHrgWuAdJe5bstWr11csae/sdNc/y0dra0u5/67LFd9mVptGHOP1NA7NrFG1FrthRNwbEfcCPweWAr8p9ctc0lXA3sC7IqIHeBqYVVA+DejNWtCHKjOzMipHfJtZ7RpljPeNQ1NEvBr4A2kcWt9Ys7MjYjbwM9JYM4YqM7PSFZ2wS5ok6SbgReAZ4EVJiyVNKXL/y4EDgaMjYlO2+iFgvKTDsuUzgW8XUWZmZTTa+Daz2jaaGI+INX2TRmQeIDWoDTTW7J3Zz0OVmVmJSukS80VgArA/qW/5LOBy4Brg3UPtKGlf4CLSVf39kgCejIh3SDoJWCRpHNktM4CI6BmszMzKbsTxDb5lblYHRhXjfao9Ds3MklIS9rcAe0bEn7PlpZJOJd0aG1JE/BZoGaTsftIJpKQyMyurEcd3xlO3mtW20cZ4n6qOQ6vkxBF588QVVopSEvaNpCejLStYN43UmmZm9W1U8e2pW81q3qi/wwvGoc3L7oIPOtZsqLJSKr169Xp6enq3Wtcoia4nrmheI5k4opSE/XrgLkmf45XbaR8EvlrSEc2sFpUtvqt5y7zSrW+NkhiYMcoYLxiH9ncDjUPLLrwHHIc2QJmZlaiUhP1y0kCVE4AZwLOkW+A3VKJiZlZV5Yzvqt0y72t9q1Ri7RYwy0MFpm2FUcS4x6GZ5a+UhP0LwDcj4si+FZJeL+nqiDi3/FUzsyoqS3znccv8/2/v/uOsqus8jr8uM8xQMOAAA4qgZsjHItOwH+5umO1qrJpplhb4o2ytNEupFk3DxPxVaIsZlG6uhiGm9oNa+4Hhlqvlj9YflVt9tFJEJX4MEwLBwMzc/viewcs4zNw7c8495977fj4e82Dm3HPO93sv85nzOd9fR0SKMuAY1zw0kfQVvawjMBP4vx7bHgFmxVcdEUnJoONbS7eKZJqu4SIVrJQW9jxQ12NbHaUl/SKSTYOKb3WZi2SeruEiFayUhP0+4DIzOz+60A4B5kXbRaSyDSq+1WUuknm6hotUsFIS9vOAu4DVZraSsMLDauC4JComImWl+BapbopxkQpWdMLu7s+Z2TTgzcAkYBXwsLt3JVU5ESkPxbdIdVOMi1S2UlrYiQL7wehLRKqI4lukuinGRSqXJpuIiIiIiGSYEnYRERERkQxTwi4iIiIikmFK2EVEREREMkwJu4iIiIhIhilhFxERERHJMCXsIiIiIiIZpoRdRERERCTDlLCLiIiIiGSYEnYRERERkQxTwi4iIiIikmFK2EVEREREMkwJu4iIiIhIhilhFxERERHJMCXsIiIiIiIZVp92BWpV86gG6hsai9q3Y3s7bRu3D7rMfD7P5s0b2bp1M11dnYM+X7nU1zfQ3NxCXZ1+XUVERKT2lCUDMrNrgPcA+wEHufsT0fYpwGJgDNAKnO7uT/X3WjWob2jkkflnFrXvoeffCAw+YW9rW0cul2P06PHU1dWTy+UGfc6k5fN5tmx5kba2dYwdu1fa1REREREpu3INiVkGHA6s7LH9emCRu08BFgE3FPmaDMD27dvYY48x1NcPrYhkHSCXyzF8+Eg6OgZ/wyIiIiJSicrSwu7u9wOY2c5tZjYOmAYcFW26DVhoZi1Abnevufu6ctS5OuXJ5Spv2kKl3FyIiFQj9ZKLpC/NQcGTgOfdvRPA3TvN7IVoe66P10pK2MeMGRFvrQu0tDQldu4kylq7dgj19bsm7K8c3khjQ/y/Bu3bO/jblvbYzjdkyJCyft4iIrLTMuDLwH09tnf3hC8xs1MJPeH/XMRrIlKiqp/F19q6ObGkfd26TS/b1jRyGMMah5alrFJ1dXXR0dG1y7bGhnpmnX/roM/d09L5p/Dixq397vfssyu54op5bNy4kVGjRjF37qVMmrTPy/br6uqK5TOoFkOG5ImpvHAAABGfSURBVBK9GS2VWuBEqpd6yUXSl2bCvgrY28zqohb0OmBCtD3Xx2uZNqxxaFEJ8NL5p5ShNtl3zTVXceKJJzFjxjEsX/4jrr76Sq677vq0qyWlUwucSG2p+F7ytKnXWEqRWsLu7mvN7HFgJrAk+vex7rvvvl6T6tDWtoEnn/wDCxYsAuDII2ewYMF82traaG5uTrl2Ugq1wIlIElpbN9PVld9lW7Ukuuo1rl0D6SUv17KO1wEnAnsCK8ys1d2nAmcBi83sc0AbcHrBYX29JlVgzZo1jB07jrq6OgDq6uoYO7aFtWvXKGGvDom3wCXd+lYtiYFIAqqyl1wkq8q1Ssy5wLm9bP8D8JbdHLPb10RE4KXWt6QSa7WASRqyNkelN+olrz6lPNBxIOJ6CGStqvpJp5Jd48ePZ/36tXR2dlJXV0dnZyfr169j3LjxaVdN4qEWOJEqoF7y2lDKAx0HIq6HQNYqJeySmubm0UyePIUVK5YzY8YxrFixnAMOMA2HqRJqgROpDuolF0mfEvYat619RyIr1mxr31HUfnPmXMTll1/CzTffSFNTExdffGnsdZHkqQVOREQkOUrYa9ymF7exiW2plb/vvvvx9a8vTq18iYda4ERERJJTec+pFxERERGpIWphFxEREcmwpJ6iLpVDCbuIiIhIhhX7FPXB0BPYs01DYkREREREMkwJu4iIiIhIhmlIjIhIAop9aqCe/iciIv1Rwl7jknoUcbFJyMKF13Lvvf/D6tUvcMst32L//SfHXheRNBT71EA9/U9ERPqjhL3GJfUo4mKTkOnTj+Ckk97POed8OPY6iIiIiFQDJeySqoMPPiTtKoiIiIhkmhJ2EZEiaS1kERFJgxJ2EZEilbIWstY0FhEZuHI0kGxr38GmF7clWkZclLCLiIiISKaU62FRm6iMhF3rsIuIiIiIZJha2Gtcx/b2aEWX+M9bjGuvvZp77/0ZGza0Mnv2OYwcOYolS+6IvT4ilaSUruDOHdupG9rQ735a711EpHIpYa9x4QKe3kV89uw5zJ49J7XyRbKo1LHyWu9dRKS6KWEXERERkZrT1bGDlpamxM4fZ8+mEnYRERERqTlD6ocm8vDIbnH2bGrSqYiIiIhIhilhryk58vmutCtRsnw+n3YVRERERFKjhL2GNDQM469/XU9Hx46KSYLz+TxbtrxIfX3/q2CIiIiIVCONYa9QxS77VvgUr+bmFjZv3siGDWvo6upMuooly+Vy5HK5l21/xSuGMXnyqxg6NLzfSnoymYiIiMhgKWGvUMUu+7bkypN3mQE9btzI3e7b22zmUtaDHmwi3dLS1Md7emDnd5X0ZDIRERGRwcp8wm5mU4DFwBigFTjd3Z9Kt1aVo5QZ0L3NZi51PWgl0lIKxbdIdVOMi8SjEsawXw8scvcpwCLghpTrI1KUppHDaGlpKuqraeSwtKubFsW3SHVTjIvEINMt7GY2DpgGHBVtug1YaGYt7r6un8PrAIYMCWOixzYPL7rchpFjitqv+9w9FVtWseXsrqyslVPsAwg6trezcdOOXl8rpqxSHnTQW1kjRjTSWMQwn/b2HWze3F5UOb0Z1jiUc69aVtS+1114AluGFF9Wwf9TXek1y4Y44xuyFw+llJVmOcUa1TSU+obGovZNM+6KLSeOspJSDfEN8cd4oVLiYyBK+TsxUKXGY9LvGZJ/33rPL9tWdIznsrxaiJkdCtzi7lMLtv0OONXdH+3n8LcC9yVZP5EMmA7cn3YlBkLxLdKvio1vUIyLFKHoGM90C/sg/YrwQawGsrckisjg1AF7EX7Pa5HiW6pZrcc3KMalupUc41lP2FcBe5tZnbt3mlkdMCHa3p92KrhlQqQIf0q7AoOk+BbZvUqPb1CMi/SlpBjP9KRTd18LPA7MjDbNBB4rYuybiGSc4lukuinGReKT6THsAGZ2IGFJqGagjbAklKdbKxGJg+JbpLopxkXikfmEXURERESklmV6SIyIiIiISK1Twi4iIiIikmFK2EVEREREMkwJu4iIiIhIhilhFxERERHJsKw/OKlszGwKYempMUArYemppxIo5xrgPcB+wEHu/kTcZUTljAG+Cbya8ACKPwIfTWL9WzNbBrwK6AI2A59w98fjLqegvEuAeST7+T0DbIu+AC5w9+UJlPNO4DIgR7iBnufu3427HClPjFdjfEflVVWMlzG+hwELgCOjsh5w94/EXY7Ew8xOAi4i/D0eBjzq7rPSrVWyzGwocDHwfmAH4Tr0I+Az7r4jzbolxcwagSuBEwjveRtwhbvfmWrF+qEW9pdcDyxy9ynAIuCGhMpZBhwOrEzo/N3ywHx3N3d/PeGJWl9IqKwPuPvB7v4G4BrgpoTKwcymAYcBzyZVRoH3uvsh0VcSF/McIek6zd0PAU4FFpuZ4jIZ5YjxaoxvqM4YTzS+I/MJycAUdz+IkBhJBpnZXsBXgXdFf49fQ/j/q3Y3A1OBQ919KvB6wIHGVGuVrK8CE4Gp7n4g4dp7rZn9S7rV6pta2AEzGwdMA46KNt0GLDSzlrhbrNz9/qjMOE/bWzkbgJ8XbHoQODuhsjYW/DiK0AoXu+iueBEwC/hZEmWkoIvwmQHsAax290Q+v1pWrhivxviOylOMl8jMRgCnAxPdPQ/g7mvSrZX0YU9Ca2srQPR/llgvUhaY2QHAuwm/o5sAolb1/0y1Ygkys32B9wH7uPs2AHd/wswuBy4B7kmzfn1Rwh5MAp53904Ad+80sxei7RX/COWoxfZs4AcJlnEj8A5CV+K/JlTM54El7v500glR5NaoFfx+4CJ3/2ucJ3f3vJmdDHzfzLYATcCxcZYhO1VtjJcjvqNyqi3GE41vwnClVuASM3s7YSjR3O6bOsmcXwMPA8+a2c8JvxffdPfWVGuVrDcAT7l7W9oVKaODgD9GjR6FHiQMk8ksdb3Xhq8QLhYLkyrA3c90930I4/+ujvv8ZvYPwJsIXVnlMN3dD47KzJHAZ2dm9cCFwPHuvi9wHHB71DInUqzE4xuqLsYTj29Cg9j+wGPu/kbgAuC7ZjYygbJkkNy9y91PAI4g9O4cC/zGzEanWrFk5dKuQAr6es/5stViAJSwB6uAvc2sDiD6d0K0vaJFk+AOAN5XjqEW7v5N4O3RpLg4vQ04EHg6mjA2EVhuZu+IuRwA3H1V9G87IYH4pwSKOQSY4O6/iMr6BbCFMHZS4lWVMV7u+IbqiPEyxfdKoIMw/Ap3fwhYD0xJoCyJibs/4e6L3P0oYCMhga9WjwIHmFlz2hUpo98Ck3u5ETsM+GUK9SmaEnbA3dcSxqrNjDbNJLSKVHpX+RXAocAJ0YUpiTJGmNmkgp+PAzZEX7Fx9y+4+wR338/d9wOeA2a4+91xlgNgZsPNbFT0fY4wez6JsYzPARMt6vs3s9cQxlH+KYGyalo1xng54jsqp6pivFzx7e7rCS21R0VlTQHGEVb0kYwxs72jXp7unycCLcDT6dUqWdEqWT8AbjCzJgiNGWZ2XrX29Lr7M8CdwNeiVZwws9cBnwTmpli1fmkM+0vOIqzQ8TmgjTBZKHZmdh1wIiExW2FmrdHM7LjLmUroun4S+GWUEz7t7u+OuajhwJ1mNhzoJFzEj+ueZFWhxgPfiVph64DfAR+LuxB3/4uZnQ1828y6W0fP6GVsncQj8RivwviG6ovxssR35CzgJjP7EmFC42kJjJWXeNQDl0aTErcSGjTnuvtj6VYrcR8gTLZ8xMy289Kyjok1AmTA2cBVwO/MLA/sDRyW5FK1ccjl85X6N1dEREREZGDMrIGw5O8kQkPEtn4OSY0SdhERERGRDNMYdhERERGRDFPCLiIiIiKSYUrYRUREREQyTAm7iIiIiEiGKWGXopjZKWZ2d8HPeTObnGadRCRbzOznZnZm2vUQETCzb5jZ5TGeb56ZLYnpXM+Y2ZFxnKtWaB122YWZvRWYD0wlrLn8e2C2u98K3FrkORoIa5y+D9gDWAcsc/dPJlJpEelX9PTQ8YS43kJYa/kT7r45xWqJSA89YrXbN9z946lUSDJBCbvsZGYjgbsIDxW4A2gAplP6AxQuBN4IvBlYDewLHB5fTUVkgI5z9xVmtjewnPBkv88Ue7CZ1bt7R2K1E5Fux7n7irQr0c3MlC+mTP8BUmgKgLvfFv28FbgbwMw+CJzp7m8t2P8YM5sNjARuBi5w9y7gTcD33P2FaL9noi+icz0D3ACcBuwFLAPOzvIDC0Sqibs/b2Y/Bl5nZmcA5wMTCb1hX3T3GwDM7AhgCfAVwqO7fwqcZmbHA5cC+0fHnOPuP4lOv6+Z/QJ4PfAAMMvd15ftzYlUqeg6/GHgYeAMwlOHTyVcuy8DGoE57r644LCxZvZT4DDgUeB0d18Zne/LhCczjwKeIvSm3xe9Ng94HbANeBfwqR51GQrcQmjYmwl0EP6OfJjQs34PcFb3k7vN7DTgcmAE8B8xfSQ1RWPYpdCTQKeZLTazo82suZ/9301oSZ8GHA98KNr+IPApM/uYmR1kZrlejj0FmAG8mvDHZm4s70BE+mVmk4BjgMeAtcA7CTfeZwALzGxawe57AqMJPWUfMbM3Ey7UcwgX5sMpuCEHZkXnGUe4mP97ku9FpMa8BfgNMAZYCnyL0Eg2mZC8LzSzEQX7n0JI5scCj7Pr0NZfAYcQ4nspcKeZDSt4/Xjg24Q433mcmb2C0NDWDpzs7tuBc4ETgLcBE4A2YFG0/2uBrxEa6SZEdZ84uI+h9qiFXXZy9xejMewXAF8H9jSzHxHumHvzxejueYOZXUu4y76RMH69jfCHYgHQamYX9rjrX+juqwDM7ApCC56SdpFkLTOzDmAj8EPgSnffWvD6vdHk8umE1jiALuASd28HMLN/A25y959Grz/fo4yb3f3JaN87CK1zIlKa7ljtNgfYATzt7jcDmNntwGeBz0fxebeZbSck749Hx/3Q3f832v+zwEYzm+Tuq9y9cALpl8xsLmDAr6NtD7j7suj7rWYG4cb+J9E+57l7Pnr9o8DH3f25qKx5wLNRy/p7gbsK6nExoPH4JVLCLrtw998DHwQwswMJ3eHXEsa79rSq4PuVhDtn3L2TcGe9KLoT/xBwk5k9HJ1/t8eKSKJO6Dku1syOBi4h9HQNAV4J/LZgl3U9hqtNIkxY3Z2/FHz/N0IXuIiUprdY/SCwpmDTVgB377mtMOZ2XmvdfbOZbSBcb1eZ2aeBM6Of84RkfGxvxxY4DBgKzCxI1iH0wH3PzLoKtnUSJs9O6FGPLWbW2su5pQ8aEiO75e5/AL5BGMfWm0kF3+8DvNBzB3ff6u6LCC3ury3lWBFJlpk1At8BrgHGu/sehGS8cBhbvsdhqwhD2UQk+3Zea6OhMqOBF8xsOqE3/WSgOYr9jfQd+xDmtV0F3GNm4wu2rwKOdvc9Cr6GufvzhMUnCuvxSsKwGCmBWthlp6hF/Vjgdnd/LhrnOpMwJr03c8zsIcLd/HlEE0miiaiPAw8RuvBOAZoI42W7nWNmdxFa4C4Cbo//HYlIPxoIE9XWAR1Ra/s7gCf6OOa/CF3vdwE/I0wcb4pu8EUkW46Jhro+TBjL/pC7rzKzgwgTRdcB9Wb2GUILe7/cfX50s3+PmR0RTSq/HrjCzD7g7ivNrAX4R3f/PmEc/EMF9fg8ajAumT4wKbSJMKHlITPbQkjUnwA+vZv9vw88QkjOf0i4kEPokvsSoWt8PXAO8B53/3PBsUsJd+p/jr5ie7iDiBTH3TcRJovdQegFmwX8oJ9juleoWEBokbuX0B0uIvH5bzPbXPD1vQGeZylhyNsG4FBCAxqEYa4/Jiw2sZKwGkxvQ2B65e6XESaerjCz0cCXCX877jazTYT84S3Rvv9PyAOWElrb24DnBvh+alYun++tx0MkOdGyjmdmaY1ZERERkaxSC7uIiIiISIYpYRcRERERyTANiRERERERyTC1sIuIiIiIZJgSdhERERGRDFPCLiIiIiKSYUrYRUREREQyTAm7iIiIiEiG/R2nBhxiyaPhlwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 756x432 with 6 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "nr_rows = 2\n",
    "nr_cols = 3\n",
    "\n",
    "fig, axs = plt.subplots(nr_rows, nr_cols, figsize=(nr_cols*3.5,nr_rows*3))\n",
    "\n",
    "for r in range(0,nr_rows):\n",
    "    for c in range(0,nr_cols):  \n",
    "        \n",
    "        i = r*nr_cols+c       \n",
    "        ax = axs[r][c]\n",
    "        sns.countplot(df_train[cols[i]], hue=df_train[\"Survived\"], ax=ax)\n",
    "        ax.set_title(cols[i])\n",
    "        ax.legend() \n",
    "        \n",
    "plt.tight_layout()  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 认识数据\n",
    "\n",
    "- 第一张图：？\n",
    "- 第二张图：？\n",
    "- 第三张图：？\n",
    "- 第四，五张图：？\n",
    "- 第六张图: ？"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 看看年龄的因素 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "bins = np.arange(0, 80, 5)\n",
    "g = sns.FacetGrid(df_train, row='Sex', col='Pclass', hue='Survived', margin_titles=True, size=3, aspect=1.1)\n",
    "g.map(sns.distplot, 'Age', kde=False, bins=bins, hist_kws=dict(alpha=0.6))\n",
    "g.add_legend()  \n",
    "plt.show()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 分析一下"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 看看你票价因素 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train['Fare'].max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "bins = np.arange(0, 550, 20)\n",
    "g = sns.FacetGrid(df_train, row='Sex', col='Pclass', hue='Survived', margin_titles=True, size=3, aspect=1.1)\n",
    "g.map(sns.distplot, 'Fare', kde=False, bins=bins, hist_kws=dict(alpha=0.6))\n",
    "g.add_legend()  \n",
    "plt.show()  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 仓位因素"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "sns.barplot(x='Pclass', y='Survived', data=df_train)\n",
    "plt.ylabel(\"Survival Rate\")\n",
    "plt.title(\"Survival as function of Pclass\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "sns.barplot(x='Sex', y='Survived', hue='Pclass', data=df_train)\n",
    "plt.ylabel(\"Survival Rate\")\n",
    "plt.title(\"Survival as function of Pclass and Sex\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 登船口因素"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "sns.barplot(x='Embarked', y='Survived', data=df_train)\n",
    "plt.ylabel(\"Survival Rate\")\n",
    "plt.title(\"Survival as function of Embarked Port\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "sns.boxplot(x='Embarked', y='Fare', data=df_train)\n",
    "plt.title(\"Fare distribution as function of Embarked Port\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 增加一些新维度\n",
    "\n",
    "### 家庭大小，单独，名字长度，称呼"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for df in [df_train, df_test] :\n",
    "    \n",
    "    df['FamilySize'] = df['SibSp'] + df['Parch']\n",
    "    \n",
    "    df['Alone']=0\n",
    "    df.loc[(df.FamilySize==0),'Alone'] = 1\n",
    "    \n",
    "    df['NameLen'] = df.Name.apply(lambda x : len(x)) \n",
    "    df['NameLenBin']=np.nan\n",
    "    for i in range(20,0,-1):\n",
    "        df.loc[ df['NameLen'] <= i*5, 'NameLenBin'] = i\n",
    "    \n",
    "    \n",
    "    df['Title']=0\n",
    "    df['Title']=df.Name.str.extract(r'([A-Za-z]+)\\.') #lets extract the Salutations\n",
    "    df['Title'].replace(['Mlle','Mme','Ms','Dr','Major','Lady','Countess','Jonkheer','Col','Rev','Capt','Sir','Don'],\n",
    "                    ['Miss','Miss','Miss','Mr','Mr','Mrs','Mrs','Other','Other','Other','Mr','Mr','Mr'],inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.subplots(figsize=(10,6))\n",
    "sns.barplot(x='NameLenBin' , y='Survived' , data = df_train)\n",
    "plt.ylabel(\"Survival Rate\")\n",
    "plt.title(\"Survival as function of NameLenBin\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 结论？？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "g = sns.factorplot(x=\"NameLenBin\", y=\"Survived\", col=\"Sex\", data=df_train, kind=\"bar\", size=5, aspect=1.2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 结论？？\n",
    "\n",
    "### 称呼因素"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.subplots(figsize=(10,6))\n",
    "sns.barplot(x='Title' , y='Survived' , data = df_train)\n",
    "plt.ylabel(\"Survival Rate\")\n",
    "plt.title(\"Survival as function of Title\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "pd.crosstab(df_train.FamilySize,df_train.Survived).apply(lambda r: r/r.sum(), axis=1).style.background_gradient(cmap='summer_r')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 结论？？"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据清洗\n",
    "\n",
    "### 第一步填充缺失数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 根据称呼补充他们的性别\n",
    "df_train['Title'] = df_train['Title'].fillna(df_train['Title'].mode().iloc[0])\n",
    "\n",
    "# 年龄使用平均值填充\n",
    "df_train.loc[(df.Age.isnull())&(df.Title=='Mr'),'Age']= df_train.Age[df.Title==\"Mr\"].mean()\n",
    "df_train.loc[(df.Age.isnull())&(df.Title=='Mrs'),'Age']= df_train.Age[df.Title==\"Mrs\"].mean()\n",
    "df_train.loc[(df.Age.isnull())&(df.Title=='Master'),'Age']= df_train.Age[df.Title==\"Master\"].mean()\n",
    "df_train.loc[(df.Age.isnull())&(df.Title=='Miss'),'Age']= df_train.Age[df.Title==\"Miss\"].mean()\n",
    "df_train.loc[(df.Age.isnull())&(df.Title=='Other'),'Age']= df_train.Age[df.Title==\"Other\"].mean()\n",
    "df_train = df_train.drop('Name', axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 设置登船口默认值是第一个\n",
    "df_train['Embarked'] = df_train['Embarked'].fillna(df_train['Embarked'].mode().iloc[0])\n",
    "# 票价用平均值填充\n",
    "df_train['Fare'] = df_train['Fare'].fillna(df_train['Fare'].mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 年龄按10年分段，票价按50分段，方便查找规律\n",
    "df = df_train\n",
    "df['Age_bin']=np.nan\n",
    "for i in range(8,0,-1):\n",
    "    df.loc[ df['Age'] <= i*10, 'Age_bin'] = i\n",
    "\n",
    "df['Fare_bin']=np.nan\n",
    "for i in range(12,0,-1):\n",
    "    df.loc[ df['Fare'] <= i*50, 'Fare_bin'] = i        \n",
    "\n",
    "# 把文字变成数字，让计算机更好处理\n",
    "df['Title'] = df['Title'].map( {'Other':0, 'Mr': 1, 'Master':2, 'Miss': 3, 'Mrs': 4 } )\n",
    "# 如果称呼为空，填充第一个\n",
    "df['Title'] = df['Title'].fillna(df['Title'].mode().iloc[0])\n",
    "df['Title'] = df['Title'].astype(int) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 复制一份数据，保护原始数据\n",
    "df_train_ml = df_train.copy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train_ml.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 把类别参数做成新的列，用０－１表示对应项\n",
    "df_train_ml = pd.get_dummies(df_train_ml, columns=['Sex', 'Embarked', 'Pclass'], drop_first=True)\n",
    "df_train_ml.drop(['PassengerId','Name','Ticket', 'Cabin', 'Age', 'Fare_bin'],axis=1,inplace=True)\n",
    "df_train_ml.dropna(inplace=True)\n",
    "df_train_ml.drop(['NameLen'], axis=1, inplace=True)\n",
    "df_train_ml.drop(['SibSp'], axis=1, inplace=True)\n",
    "df_train_ml.drop(['Parch'], axis=1, inplace=True)\n",
    "df_train_ml.drop(['Alone'], axis=1, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train_ml.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 下一步就是机器学习，有兴趣同学可以看 sklearn\n",
    "\n",
    "官网：https://scikit-learn.org/stable/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
